package pe.gob.foncodes.spp.web.controladores.portafolio;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;

import org.apache.log4j.Logger;

import pe.gob.foncodes.spp.bs.domain.Indicador;
import pe.gob.foncodes.spp.bs.domain.Objetivo;
import pe.gob.foncodes.spp.bs.domain.Parametro;
import pe.gob.foncodes.spp.bs.domain.Portafolio;
import pe.gob.foncodes.spp.bs.services.SppServices;
import pe.gob.foncodes.spp.web.controladores.ControladorMenu;

@ManagedBean
@ApplicationScoped
public class ControladorMarcoLogico implements Serializable {

	private static final long serialVersionUID = 9181772024128174141L;

	private Objetivo objetivo;
	private Objetivo objetivoBusqueda;

	private Indicador indicador;
	private Indicador indicadorBusqueda;

	private List<Objetivo> objetivos;

	private List<Parametro> tiposObjetivo;
	private List<Parametro> tiposObjetivoPrecedente;
	private List<Parametro> estadosObjetivo;

	private Portafolio portafolio;

	private Parametro parametro;

	private static Logger LOGGER = Logger
			.getLogger(ControladorMarcoLogico.class);

	@ManagedProperty("#{controladorMenu}")
	private ControladorMenu controladorMenu;

	@ManagedProperty("#{sppServices}")
	private SppServices sppServices;

	public ControladorMarcoLogico() {
		// OBJETIVOS
		objetivo = new Objetivo();
		objetivoBusqueda = new Objetivo();

	}

	@PostConstruct
	public void inicializar() {
		this.tiposObjetivo = this.sppServices.buscarTipoObjetivo();
		this.tiposObjetivoPrecedente = this.sppServices.buscarTipoObjetivo();
		this.estadosObjetivo = this.sppServices
				.buscarEstadosGeneralesActivoNoActivo();
	}

	public void nuevoObjetivo() {
		this.objetivo = new Objetivo();
		this.parametro = new Parametro();

		inicializar();

	}

	public void asignarPrecedente() {
		LOGGER.info(" Asignando precedente ");

		parametro = this.sppServices
				.buscarObjetivoPrecedentePorTipoObjetivo(this.objetivo
						.getTipObjetivo());

		if (parametro != null) {

			if (parametro.getCodParametroPadre() != null) {
				parametro = this.sppServices
						.buscarObjetivoPrecedentePorTipoObjetivo(parametro
								.getCodParametroPadre());
			}

			LOGGER.info(" tipo objetivo " + this.objetivo.getTipObjetivo());
			this.objetivo.setTipObjetivoPrecedente(parametro.getCodParametro());
			LOGGER.info(" tipo objetivo precedente"
					+ this.objetivo.getTipObjetivoPrecedente());
		}

	}

	public void buscarParaMostrar(Long nidObjetivo) {
		this.objetivo = this.sppServices.buscarObjetivoPorId(nidObjetivo);
		asignarPrecedente();
	}

	public void guardarObjetivo() {
		LOGGER.info("guardarObjetivo");
		try {
			LOGGER.info("Portafolio ID" + portafolio.getNidTipPortafolio());

			this.objetivo.setPortafolio(portafolio);
			this.sppServices.guardarObjetivo(objetivo);

			buscarObjetivosPorFiltros();
			// Limpiar ObjetivoNuevo
			this.objetivo = new Objetivo();
			this.controladorMenu = getControladorMenu();
			this.controladorMenu.setTapPortafolio(new Integer(2));
			LOGGER.info("finGuardarObjetivo");
		} catch (Exception e) {
			LOGGER.error("Error al Guardar Objetivo", e.fillInStackTrace());
		}
	}

	public void actualizarObjetivo() {
		System.out.println("actualizarObjetivo");
		try {

			LOGGER.info("Portafolio ID" + portafolio.getNidPortafolio());
			LOGGER.info("Objetivo ID" + objetivo.getNidObjetivo());
			objetivo.setPortafolio(portafolio);
			this.sppServices.actualizarObjetivo(objetivo);

			buscarObjetivosPorFiltros();
			this.controladorMenu = getControladorMenu();
			this.controladorMenu.setTapPortafolio(new Integer(2));
			// Limpiar ObjetivoNuevo
			this.objetivo = new Objetivo();

			LOGGER.info("finActualizarObjetivo");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.print("Error al Guardar Objetivo" + e.getMessage());
		}
	}

	public void limpiar() {
		objetivoBusqueda = new Objetivo();
		objetivos = new ArrayList<Objetivo>();
	}

	public void buscarObjetivosPorFiltros() {
		objetivos = new ArrayList<Objetivo>();
		objetivos = this.sppServices
				.buscarObjetivoPorIdoNOmbreOtipoObjetivo(objetivoBusqueda);
	}

	public Objetivo getObjetivo() {
		return objetivo;
	}

	public void setObjetivo(Objetivo objetivo) {
		this.objetivo = objetivo;
	}

	public List<Objetivo> getObjetivos() {
		if (objetivos == null)
			objetivos = portafolio.getObjetivos();
		return objetivos;
	}

	public void setObjetivos(List<Objetivo> objetivos) {
		this.objetivos = objetivos;
	}

	public SppServices getSppServices() {
		return sppServices;
	}

	public void setSppServices(SppServices sppServices) {
		this.sppServices = sppServices;
	}

	public List<Parametro> getTiposObjetivo() {
		return tiposObjetivo;
	}

	public void setTiposObjetivo(List<Parametro> tiposObjetivo) {
		this.tiposObjetivo = tiposObjetivo;
	}

	public List<Parametro> getEstadosObjetivo() {
		return estadosObjetivo;
	}

	public void setEstadosObjetivo(List<Parametro> estadosObjetivo) {
		this.estadosObjetivo = estadosObjetivo;
	}

	public Portafolio getPortafolio() {
		return portafolio;
	}

	public void setPortafolio(Portafolio portafolio) {
		this.portafolio = portafolio;
	}

	public Objetivo getObjetivoBusqueda() {
		return objetivoBusqueda;
	}

	public void setObjetivoBusqueda(Objetivo objetivoBusqueda) {
		this.objetivoBusqueda = objetivoBusqueda;
	}

	public List<Parametro> getTiposObjetivoPrecedente() {
		return tiposObjetivoPrecedente;
	}

	public void setTiposObjetivoPrecedente(
			List<Parametro> tiposObjetivoPrecedente) {
		this.tiposObjetivoPrecedente = tiposObjetivoPrecedente;
	}

	public Parametro getParametro() {
		return parametro;
	}

	public void setParametro(Parametro parametro) {
		this.parametro = parametro;
	}

	public ControladorMenu getControladorMenu() {
		return controladorMenu;
	}

	public void setControladorMenu(ControladorMenu controladorMenu) {
		this.controladorMenu = controladorMenu;
	}

	public Indicador getIndicador() {
		return indicador;
	}

	public void setIndicador(Indicador indicador) {
		this.indicador = indicador;
	}

	public Indicador getIndicadorBusqueda() {
		return indicadorBusqueda;
	}

	public void setIndicadorBusqueda(Indicador indicadorBusqueda) {
		this.indicadorBusqueda = indicadorBusqueda;
	}

}
